package cn.itsource.ymcc.service.impl;

import cn.itsource.ymcc.result.JsonResult;
import cn.itsource.ymcc.service.IVerifycodeService;
import cn.itsource.ymcc.util.AssertUtil;
import cn.itsource.ymcc.util.StrUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;

@Slf4j
@Service
public class VerifycodeServiceImpl implements IVerifycodeService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 发送短信验证码
     * @param phone
     * @return
     */
    @Override
    public JsonResult sendSmsCode(String phone) {
        //手机号不能为空
        AssertUtil.isTrue(StringUtils.hasText(phone), "手机号不能为空！");
        //手机号格式
        Pattern pattern = Pattern.compile("^1[3-9]{1}[0-9]{9}$");
        AssertUtil.isTrue(pattern.matcher(phone).find(), "手机号格式错误！");

        //手机号必须是未注册的：openfeign访问用户中心接口，通过手机号查询用户，查不到就表示允许注册

        String code = StrUtils.getRandomString(6);
        if(redisTemplate.hasKey(phone)){
            /**
             * 判断用户是不是在1分钟内频繁获取验证码
             *  1）可以用当前系统时间戳 减去 上次获取时间戳，差值判断小于60秒
             *  2）使用剩余过期事件是否大于240秒
             */
            Long expire = redisTemplate.getExpire(phone, TimeUnit.SECONDS);
            if(expire > 240){
                return JsonResult.error("兄弟，你太快了吧！");
            }
            //大于1分钟，取出上次的验证码
            code = (String) redisTemplate.opsForValue().get(phone);
        }
        String msg = "您正在注册源码云课堂账户，您的验证码是：" + code + "，请在5分钟内完成操作，验证码属于隐私信息，打死也补要告诉别人哦！";
        //发短信。。。。。省略。。。
        log.info(msg);
        redisTemplate.opsForValue().set(phone, code, 300, TimeUnit.SECONDS);
        return JsonResult.me();
    }
}
